/**
 * IPC通信类型定义
 *
 * @fileoverview 定义Electron主进程与渲染进程之间的IPC通信数据结构。
 * 包含脚本执行、配置管理、数据库操作、日志查询等各种通信场景的类型定义。
 *
 * 主要通信模块：
 * - 脚本执行（ScriptRun*）- 自动化脚本的启动、停止、状态查询
 * - 可用性查询（AvailabilityCheck*）- 预约时间可用性检查
 * - 配置管理（ConfigGet*, ConfigSet*）- 应用配置的读取和设置
 * - 数据库操作（Database*）- 数据的增删改查操作
 * - 日志管理（LogQuery*）- 日志数据的查询和管理
 * - 预约记录（AppointmentRecord）- 预约数据的完整结构
 *
 * @author System
 * @version 1.0.0
 * @since 2024
 *
 * @example
 * ```typescript
 * import type { ScriptRunRequest, AppointmentRecord } from './ipc'
 *
 * // 在渲染进程中调用
 * const request: ScriptRunRequest = {
 *   user_info: userInfo,
 *   mode: 'standard',
 *   preferred_dates: ['25-12-2024']
 * }
 *
 * const response = await window.api.script.run(request)
 * ```
 */

import type { UserInfo } from './config'

// ============================================================================
// 脚本执行相关类型
// ============================================================================

/**
 * 脚本运行请求接口
 *
 * @description 定义启动自动化脚本的请求参数，包含用户信息、偏好设置、执行模式等。
 *
 * @interface ScriptRunRequest
 * @example
 * ```typescript
 * const request: ScriptRunRequest = {
 *   user_info: {
 *     passport_number: 'E12345678',
 *     license_number: '440123199001011234',
 *     license_owner_name: '张三',
 *     email: 'zhangsan@example.com',
 *     phone_number: '13800138000',
 *     issuing_country: 'CN',
 *     issuing_authority: 'GD'
 *   },
 *   preferred_dates: ['25-12-2024', '26-12-2024'],
 *   preferred_times: ['09:00-10:00', '14:00-15:00'],
 *   mode: 'standard',
 *   options: {
 *     headless: false,
 *     timeout: 30000,
 *     max_retries: 3
 *   }
 * }
 * ```
 */
export interface ScriptRunRequest {
  /** 用户信息 */
  user_info: UserInfo
  /** 首选预约日期列表（可选） */
  preferred_dates?: string[]
  /** 首选预约时间列表（可选） */
  preferred_times?: string[]
  /** 执行模式：标准/快速/监控 */
  mode: 'standard' | 'quick' | 'monitor'
  /** 执行选项配置（可选） */
  options?: {
    /** 是否使用无头模式 */
    headless?: boolean
    /** 超时时间（毫秒） */
    timeout?: number
    /** 最大重试次数 */
    max_retries?: number
  }
}

/**
 * 脚本运行响应接口
 *
 * @description 定义脚本启动后的响应结果，包含作业ID和执行状态。
 *
 * @interface ScriptRunResponse
 * @example
 * ```typescript
 * const response: ScriptRunResponse = {
 *   success: true,
 *   job_id: 'job_20241225_001',
 *   message: '脚本启动成功'
 * }
 * ```
 */
export interface ScriptRunResponse {
  /** 操作是否成功 */
  success: boolean
  /** 作业唯一标识符 */
  job_id: string
  /** 响应消息 */
  message: string
  /** 错误信息（失败时提供） */
  error?: string
}

/**
 * 脚本停止请求接口
 *
 * @description 定义停止正在运行脚本的请求参数。
 *
 * @interface ScriptStopRequest
 * @example
 * ```typescript
 * const stopRequest: ScriptStopRequest = {
 *   job_id: 'job_20241225_001',
 *   force: true
 * }
 * ```
 */
export interface ScriptStopRequest {
  /** 要停止的作业ID */
  job_id: string
  /** 是否强制停止（可选） */
  force?: boolean
}

/**
 * 脚本停止响应接口
 *
 * @description 定义脚本停止操作的响应结果。
 *
 * @interface ScriptStopResponse
 */
export interface ScriptStopResponse {
  /** 操作是否成功 */
  success: boolean
  /** 响应消息 */
  message: string
}

/**
 * 脚本历史清理请求接口
 *
 * @description 清理历史任务记录，可选择保留运行中任务或按时间阈值删除。
 *
 * @interface ScriptClearRequest
 */
export interface ScriptClearRequest {
  /** 是否保留运行中任务（默认 true） */
  keep_running?: boolean
  /** 仅删除早于此 Unix 秒时间戳的记录（可选） */
  older_than?: number
}

/**
 * 脚本历史清理响应接口
 *
 * @interface ScriptClearResponse
 */
export interface ScriptClearResponse {
  /** 操作是否成功 */
  success: boolean
  /** 实际删除的记录数量 */
  deleted_count: number
  /** 错误信息（失败时提供） */
  error?: string
}

/**
 * 脚本状态查询请求接口
 *
 * @description 定义查询脚本执行状态的请求参数。
 *
 * @interface ScriptStatusRequest
 * @example
 * ```typescript
 * // 查询特定作业状态
 * const specificJobRequest: ScriptStatusRequest = {
 *   job_id: 'job_20241225_001'
 * }
 *
 * // 查询所有作业状态
 * const allJobsRequest: ScriptStatusRequest = {}
 * ```
 */
export interface ScriptStatusRequest {
  /** 作业ID，不传则获取所有任务状态 */
  job_id?: string
}

/**
 * 作业状态接口
 *
 * @description 定义单个作业的完整状态信息，包含执行进度、结果、错误等。
 *
 * @interface JobStatus
 * @example
 * ```typescript
 * const jobStatus: JobStatus = {
 *   job_id: 'job_20241225_001',
 *   status: 'running',
 *   progress: 75,
 *   current_step: '选择预约时间',
 *   start_time: Date.now() - 120000,
 *   result: {
 *     selected_date: '25-12-2024',
 *     selected_timeslot: '09:00-10:00'
 *   }
 * }
 * ```
 */
export interface JobStatus {
  /** 作业类型（script/booking/booking_batch/monitor等） */
  type?: string
  /** 作业唯一标识符 */
  job_id: string
  /** 作业执行状态 */
  status: 'pending' | 'running' | 'success' | 'failed' | 'cancelled'
  /** 执行进度（0-100，可选） */
  progress?: number
  /** 当前执行步骤（可选） */
  current_step?: string
  /** 开始时间戳（可选） */
  start_time?: number
  /** 结束时间戳（可选） */
  end_time?: number
  /** 执行结果（可选） */
  result?: {
    /** 预约参考号 */
    reference_number?: string
    /** 已选择的日期 */
    selected_date?: string
    /** 已选择的时间段 */
    selected_timeslot?: string
    /** 运行日志（可选）：按时间记录步骤与消息 */
    logs?: Array<{
      /** Unix 秒时间戳 */
      timestamp: number
      /** 步骤名称（可选） */
      step?: string
      /** 日志阶段/级别（可选） */
      phase?: 'start' | 'success' | 'error' | 'info' | 'warn'
      /** 文本消息（可选） */
      message?: string
    }>
  }
  /** 错误信息（失败时提供） */
  error?: string
}

/**
 * 脚本状态查询响应接口
 *
 * @description 定义脚本状态查询的响应结果。
 *
 * @interface ScriptStatusResponse
 */
export interface ScriptStatusResponse {
  /** 操作是否成功 */
  success: boolean
  /** 作业状态列表 */
  jobs: JobStatus[]
}

// ============================================================================
// 可用性查询相关类型
// ============================================================================

/**
 * 可用性检查请求接口
 *
 * @description 定义查询预约时间可用性的请求参数。
 *
 * @interface AvailabilityCheckRequest
 * @example
 * ```typescript
 * const checkRequest: AvailabilityCheckRequest = {
 *   service_type: 'DI',
 *   office_code: 'HKLO',
 *   date_range: {
 *     start: '2024-12-25',
 *     end: '2024-12-31'
 *   },
 *   use_cache: true
 * }
 * ```
 */
export interface AvailabilityCheckRequest {
  /** 服务类型代码 */
  service_type: string
  /** 办公地点代码 */
  office_code: string
  /** 查询日期范围（可选） */
  date_range?: {
    /** 开始日期，格式：YYYY-MM-DD */
    start: string
    /** 结束日期，格式：YYYY-MM-DD */
    end: string
  }
  /** 是否使用缓存（可选） */
  use_cache?: boolean
}

/**
 * 时间段信息接口
 *
 * @description 定义单个预约时间段的详细信息。
 *
 * @interface TimeslotInfo
 * @example
 * ```typescript
 * const timeslot: TimeslotInfo = {
 *   id: 'slot_001',
 *   start_time: '0900',
 *   end_time: '1000',
 *   display_time: '09:00-10:00',
 *   available: true
 * }
 * ```
 */
export interface TimeslotInfo {
  /** 时间段唯一标识符 */
  id: string
  /** 开始时间，格式：HHMM */
  start_time: string
  /** 结束时间，格式：HHMM */
  end_time: string
  /** 显示时间，格式：HH:MM-HH:MM */
  display_time: string
  /** 是否可用 */
  available: boolean
}

/**
 * 可用性检查响应接口
 *
 * @description 定义可用性查询的响应结果，包含可用日期、时间段等信息。
 *
 * @interface AvailabilityCheckResponse
 * @example
 * ```typescript
 * const response: AvailabilityCheckResponse = {
 *   success: true,
 *   data: {
 *     available_dates: [
 *       {
 *         date: '25-12-2024',
 *         timeslots: [timeslot1, timeslot2]
 *       }
 *     ],
 *     last_updated: Date.now(),
 *     cache_ttl: 300
 *   }
 * }
 * ```
 */
export interface AvailabilityCheckResponse {
  /** 操作是否成功 */
  success: boolean
  /** 可用性数据 */
  data: {
    /** 可用日期列表 */
    available_dates: {
      /** 日期，格式：YYYY-MM-DD */
      date: string
      /** 该日期的时间段列表 */
      timeslots: TimeslotInfo[]
    }[]
    /** 数据最后更新时间戳 */
    last_updated: number
    /** 缓存生存时间（秒） */
    cache_ttl: number
  }
  /** 错误信息（失败时提供） */
  error?: string
}

// ============================================================================
// 配置管理相关类型
// ============================================================================

/**
 * 配置获取请求接口
 *
 * @description 定义获取应用配置的请求参数。
 *
 * @interface ConfigGetRequest
 * @example
 * ```typescript
 * // 获取所有配置
 * const getAllRequest: ConfigGetRequest = {}
 *
 * // 获取特定配置项
 * const getSpecificRequest: ConfigGetRequest = {
 *   keys: ['proxy.enabled', 'logging.log_level']
 * }
 * ```
 */
export interface ConfigGetRequest {
  /** 配置键列表，不传则获取所有配置 */
  keys?: string[]
}

/**
 * 配置获取响应接口
 *
 * @description 定义配置获取操作的响应结果。
 *
 * @interface ConfigGetResponse
 */
export interface ConfigGetResponse {
  /** 操作是否成功 */
  success: boolean
  /** 配置数据 */
  config: Record<string, any>
  /** 错误信息（失败时提供） */
  error?: string
}

/**
 * 配置设置请求接口
 *
 * @description 定义设置应用配置的请求参数。
 *
 * @interface ConfigSetRequest
 * @example
 * ```typescript
 * const setRequest: ConfigSetRequest = {
 *   config: {
 *     'proxy.enabled': true,
 *     'logging.log_level': 'INFO'
 *   },
 *   validate: true
 * }
 * ```
 */
export interface ConfigSetRequest {
  /** 要设置的配置项 */
  config: Record<string, any>
  /** 是否验证配置有效性（可选） */
  validate?: boolean
}

/**
 * 配置设置响应接口
 *
 * @description 定义配置设置操作的响应结果。
 *
 * @interface ConfigSetResponse
 */
export interface ConfigSetResponse {
  /** 操作是否成功 */
  success: boolean
  /** 响应消息 */
  message: string
  /** 验证错误列表（验证失败时提供） */
  validation_errors?: string[]
  /** 错误信息（失败时提供） */
  error?: string
}

// ============================================================================
// 数据库操作相关类型
// ============================================================================

/**
 * 预约记录接口
 *
 * @description 定义完整的预约记录数据结构，包含用户信息、预约详情、状态管理等所有字段。
 * 这是系统中最核心的数据实体，贯穿整个预约流程。
 *
 * @interface AppointmentRecord
 * @example
 * ```typescript
 * const appointment: AppointmentRecord = {
 *   id: 1001,
 *   reference_number: 'REF20241225001',
 *   user_passport: 'E12345678',
 *   user_license: '440123199001011234',
 *   user_name: '张三',
 *   user_email: 'zhangsan@example.com',
 *   user_phone: '13800138000',
 *   issuing_country: 'CN',
 *   issuing_authority: 'GD',
 *   service_type: 'DI',
 *   office_code: 'HKLO',
 *   appointment_date: '25-12-2024',
 *   appointment_time: '09:00-10:00',
 *   timeslot_id: 'slot_001',
 *   status: 'confirmed',
 *   booking_mode: 'standard',
 *   job_id: 'job_20241225_001',
 *   created_at: Date.now(),
 *   updated_at: Date.now(),
 *   completed_at: Date.now()
 * }
 * ```
 */
export interface AppointmentRecord {
  /** 记录唯一标识符 */
  id: number
  /** 预约参考号（成功预约后生成） */
  reference_number?: string
  /** 用户护照号码 */
  user_passport: string
  /** 用户驾照号码 */
  user_license: string
  /** 用户姓名 */
  user_name: string
  /** 用户邮箱 */
  user_email: string
  /** 用户电话（可选） */
  user_phone?: string
  /** 证件签发国家 */
  issuing_country: string
  /** 证件签发机关 */
  issuing_authority: string
  /** 服务类型代码 */
  service_type: string
  /** 办公地点代码 */
  office_code: string
  /** 预约日期，格式：YYYY-MM-DD */
  appointment_date: string
  /** 预约时间，格式：HH:MM-HH:MM */
  appointment_time: string
  /** 时间段标识符（可选） */
  timeslot_id?: string
  /** 预约状态 */
  status: 'pending' | 'confirmed' | 'cancelled' | 'failed'
  /** 预约模式 */
  booking_mode: 'standard' | 'quick' | 'batch' | 'monitor'
  /** 关联的作业ID（可选） */
  job_id?: string
  /** 创建时间戳 */
  created_at: number
  /** 更新时间戳 */
  updated_at: number
  /** 完成时间戳（可选） */
  completed_at?: number
  /** 错误信息（失败时记录） */
  error_message?: string
}

/**
 * 预约记录列表查询请求接口
 *
 * @description 定义查询预约记录列表的参数，支持过滤、分页、排序等功能。
 *
 * @interface AppointmentsListRequest
 */
export interface AppointmentsListRequest {
  /** 过滤条件（可选） */
  filters?: {
    /** 状态过滤 */
    status?: string
    /** 日期范围过滤 */
    date_range?: { start: string, end: string }
    /** 用户信息过滤 */
    user_info?: Partial<UserInfo>
  }
  /** 分页配置（可选） */
  pagination?: {
    /** 偏移量 */
    offset: number
    /** 每页数量 */
    limit: number
  }
  /** 排序配置（可选） */
  sort?: {
    /** 排序字段 */
    field: string
    /** 排序方向 */
    order: 'asc' | 'desc'
  }
}

/**
 * 预约记录列表查询响应接口
 *
 * @interface AppointmentsListResponse
 */
export interface AppointmentsListResponse {
  /** 操作是否成功 */
  success: boolean
  /** 查询结果数据 */
  data: {
    /** 预约记录列表 */
    appointments: AppointmentRecord[]
    /** 总记录数 */
    total: number
    /** 是否有更多数据 */
    has_more: boolean
  }
  /** 错误信息（失败时提供） */
  error?: string
}

/**
 * 预约记录导出请求接口
 *
 * @interface AppointmentsExportRequest
 */
export interface AppointmentsExportRequest {
  /** 导出格式 */
  format: 'csv' | 'xlsx'
  /** 过滤条件（可选） */
  filters?: {
    /** 状态过滤 */
    status?: string
    /** 日期范围过滤 */
    date_range?: { start: string, end: string }
  }
  /** 文件保存路径，不传则使用默认路径 */
  file_path?: string
}

/**
 * 预约记录导出响应接口
 *
 * @interface AppointmentsExportResponse
 */
export interface AppointmentsExportResponse {
  /** 操作是否成功 */
  success: boolean
  /** 导出文件路径 */
  file_path: string
  /** 导出记录数量 */
  record_count: number
  /** 错误信息（失败时提供） */
  error?: string
}

// ============================================================================
// 日志管理相关类型
// ============================================================================

/**
 * 日志订阅请求接口
 *
 * @interface LogSubscribeRequest
 */
export interface LogSubscribeRequest {
  /** 日志级别过滤（可选） */
  level?: 'debug' | 'info' | 'warn' | 'error'
  /** 日志来源过滤（可选） */
  source?: string
}

/**
 * 日志事件接口
 *
 * @interface LogEvent
 */
export interface LogEvent {
  /** 时间戳 */
  timestamp: number
  /** 日志级别 */
  level: string
  /** 日志来源 */
  source: string
  /** 日志消息 */
  message: string
  /** 附加数据（可选） */
  data?: any
  /** 追踪ID（可选） */
  trace_id?: string
}

/**
 * 获取日志文件请求接口
 *
 * @interface LogGetFilesRequest
 */
export interface LogGetFilesRequest {
  /** 日期范围（可选） */
  date_range?: { start: string, end: string }
}

/**
 * 获取日志文件响应接口
 *
 * @interface LogGetFilesResponse
 */
export interface LogGetFilesResponse {
  /** 操作是否成功 */
  success: boolean
  /** 日志文件列表 */
  files: {
    /** 文件路径 */
    file_path: string
    /** 日期 */
    date: string
    /** 日志级别 */
    level: string
    /** 文件大小 */
    size: number
    /** 最后修改时间 */
    last_modified: number
  }[]
  /** 错误信息（失败时提供） */
  error?: string
}

// ============================================================================
// 批量任务相关类型
// ============================================================================

/** 批量导入请求接口 */
export interface BatchImportRequest {
  /** 导入文件路径 */
  file_path: string
  /** 文件格式 */
  format: 'csv' | 'xlsx'
  /** 导入选项（可选） */
  options?: {
    /** 是否跳过验证 */
    skip_validation?: boolean
    /** 优先级 */
    priority?: number
  }
}

/** 批量用户数据接口 */
export interface BatchUserData {
  /** 用户ID */
  id: string
  /** 护照号码 */
  passport_number: string
  /** 驾照号码 */
  license_number: string
  /** 姓名 */
  license_owner_name: string
  /** 邮箱 */
  email: string
  /** 电话（可选） */
  phone_number?: string
  /** 签发国家 */
  issuing_country: string
  /** 签发机关 */
  issuing_authority: string
  /** 服务类型 */
  service_type: string
  /** 首选日期（可选） */
  preferred_dates?: string[]
  /** 首选时间（可选） */
  preferred_times?: string[]
  /** 优先级 */
  priority: number
  /** 处理状态 */
  status: 'pending' | 'processing' | 'success' | 'failed' | 'cancelled'
  /** 批次ID（可选） */
  batch_id?: string
  /** 预约ID（可选） */
  appointment_id?: number
  /** 错误信息（可选） */
  error_message?: string
  /** 重试次数 */
  retry_count: number
  /** 创建时间 */
  created_at: number
  /** 更新时间 */
  updated_at: number
  /** 处理时间（可选） */
  processed_at?: number
}

/** 批量导入响应接口 */
export interface BatchImportResponse {
  /** 操作是否成功 */
  success: boolean
  /** 导入结果数据 */
  data: {
    /** 导入数量 */
    imported_count: number
    /** 验证错误列表 */
    validation_errors: string[]
    /** 用户数据列表 */
    users: BatchUserData[]
  }
  /** 错误信息（可选） */
  error?: string
}

/** 批量启动请求接口 */
export interface BatchStartRequest {
  /** 用户ID列表 */
  user_ids: string[]
  /** 启动选项（可选） */
  options?: {
    /** 并发限制 */
    concurrent_limit?: number
    /** 是否重试失败项 */
    retry_failed?: boolean
  }
}

/** 批量启动响应接口 */
export interface BatchStartResponse {
  /** 操作是否成功 */
  success: boolean
  /** 批次ID */
  batch_id: string
  /** 响应消息 */
  message: string
  /** 错误信息（可选） */
  error?: string
}

// ============================================================================
// IPC错误码定义
// ============================================================================

/**
 * IPC通信错误码常量
 *
 * @description 定义IPC通信中可能遇到的各种错误码，便于错误分类和处理。
 *
 * @const IPC_ERROR_CODES
 */
export const IPC_ERROR_CODES = {
  // 通用错误
  /** 无效请求 */
  INVALID_REQUEST: 'IPC_E_001',
  /** 无效参数 */
  INVALID_PARAMS: 'IPC_E_002',
  /** 权限拒绝 */
  PERMISSION_DENIED: 'IPC_E_003',
  /** 请求超时 */
  TIMEOUT: 'IPC_E_004',

  // 脚本执行错误
  /** 脚本未找到 */
  SCRIPT_NOT_FOUND: 'SCRIPT_E_001',
  /** 脚本已在运行 */
  SCRIPT_ALREADY_RUNNING: 'SCRIPT_E_002',
  /** 脚本执行失败 */
  SCRIPT_FAILED: 'SCRIPT_E_003',
  /** 浏览器错误 */
  BROWSER_ERROR: 'SCRIPT_E_004',

  // 配置错误
  /** 配置无效 */
  CONFIG_INVALID: 'CONFIG_E_001',
  /** 配置只读 */
  CONFIG_READONLY: 'CONFIG_E_002',

  // 数据库错误
  /** 数据库连接错误 */
  DB_CONNECTION_ERROR: 'DB_E_001',
  /** 数据库查询错误 */
  DB_QUERY_ERROR: 'DB_E_002',
  /** 数据库约束错误 */
  DB_CONSTRAINT_ERROR: 'DB_E_003',

  // 文件操作错误
  /** 文件未找到 */
  FILE_NOT_FOUND: 'FILE_E_001',
  /** 文件权限错误 */
  FILE_PERMISSION_ERROR: 'FILE_E_002',
  /** 文件格式错误 */
  FILE_FORMAT_ERROR: 'FILE_E_003',
} as const

/** IPC错误码类型 */
export type IPCErrorCode = typeof IPC_ERROR_CODES[keyof typeof IPC_ERROR_CODES]
